// pages/rescue/rescue.js
const { post } = require('../../utils/request')
const { upload } = require('../../utils/request')
const { showSuccess, showError, showConfirm, checkLoginForTabBar } = require('../../utils/util')

Page({
  data: {
    petTypeIndex: 0,
    petTypeList: ['请选择宠物类型', '猫', '狗', '其他'],
    formData: {
      petType: '',
      location: '',
      description: '',
      phone: ''
    },
    imageList: [],
    submitting: false
  },

  onLoad() {
    // 页面加载时不检查登录状态，在onShow中检查
  },

  onShow() {
    // 每次显示页面时刷新登录状态
    const app = getApp()
    if (app && app.refreshLoginStatus) {
      app.refreshLoginStatus()
    }

    // 检查登录状态
    if (!checkLoginForTabBar()) {
      return
    }

    const userInfo = app.globalData.userInfo

    this.setData({
      'formData.phone': userInfo.phone || ''
    })
  },

  // 宠物类型选择
  onPetTypeChange(e) {
    const index = parseInt(e.detail.value)
    this.setData({
      petTypeIndex: index,
      'formData.petType': index > 0 ? this.data.petTypeList[index] : ''
    })
  },

  // 救助地点输入
  onLocationInput(e) {
    this.setData({
      'formData.location': e.detail.value
    })
  },

  // 救助描述输入
  onDescriptionInput(e) {
    this.setData({
      'formData.description': e.detail.value
    })
  },

  // 联系电话输入
  onPhoneInput(e) {
    this.setData({
      'formData.phone': e.detail.value
    })
  },

  // 获取当前位置
  getLocation() {
    wx.showLoading({
      title: '获取位置中...'
    })

    wx.getLocation({
      type: 'gcj02',
      success: (res) => {
        // 调用逆地理编码获取地址
        this.reverseGeocode(res.latitude, res.longitude)
      },
      fail: (err) => {
        wx.hideLoading()
        if (err.errMsg.includes('auth deny')) {
          wx.showModal({
            title: '提示',
            content: '需要获取您的位置信息，请在设置中开启位置权限',
            confirmText: '去设置',
            success: (res) => {
              if (res.confirm) {
                wx.openSetting()
              }
            }
          })
        } else {
          showError('获取位置失败')
        }
      }
    })
  },

  // 逆地理编码（这里简化处理，实际项目中可以调用地图API）
  reverseGeocode(latitude, longitude) {
    wx.hideLoading()
    
    // 简化处理，实际应该调用腾讯地图或百度地图API
    const location = `纬度:${latitude.toFixed(6)}, 经度:${longitude.toFixed(6)}`
    this.setData({
      'formData.location': location
    })
    
    showSuccess('位置获取成功')
  },

  // 选择图片
  chooseImage() {
    const remainCount = 3 - this.data.imageList.length

    wx.chooseImage({
      count: remainCount,
      sizeType: ['compressed'], // 选择压缩图片
      sourceType: ['album', 'camera'],
      success: (res) => {
        // 进一步压缩图片
        this.compressImages(res.tempFilePaths)
      }
    })
  },

  // 压缩图片
  async compressImages(tempFilePaths) {
    wx.showLoading({
      title: '处理图片中...',
      mask: true
    })

    try {
      const compressedPaths = []

      for (let i = 0; i < tempFilePaths.length; i++) {
        const filePath = tempFilePaths[i]
        console.log('开始压缩图片:', filePath)

        try {
          const compressedPath = await this.compressImage(filePath)
          compressedPaths.push(compressedPath)
          console.log('图片压缩成功:', compressedPath)
        } catch (err) {
          console.error('图片压缩失败:', err)
          // 如果压缩失败，使用原图片
          compressedPaths.push(filePath)
        }
      }

      this.setData({
        imageList: [...this.data.imageList, ...compressedPaths]
      })
    } catch (err) {
      console.error('图片处理失败:', err)
      wx.showToast({
        title: '图片处理失败',
        icon: 'none'
      })
    } finally {
      wx.hideLoading()
    }
  },

  // 单个图片压缩
  compressImage(filePath) {
    return new Promise((resolve, reject) => {
      wx.compressImage({
        src: filePath,
        quality: 60, // 压缩质量，0-100，数值越小压缩越厉害
        success: (res) => {
          console.log('压缩前大小:', filePath)
          console.log('压缩后大小:', res.tempFilePath)
          resolve(res.tempFilePath)
        },
        fail: (err) => {
          console.error('图片压缩失败:', err)
          reject(err)
        }
      })
    })
  },

  // 预览图片
  previewImage(e) {
    const index = e.currentTarget.dataset.index
    wx.previewImage({
      current: this.data.imageList[index],
      urls: this.data.imageList
    })
  },

  // 删除图片
  deleteImage(e) {
    const index = e.currentTarget.dataset.index
    const imageList = [...this.data.imageList]
    imageList.splice(index, 1)
    this.setData({
      imageList
    })
  },

  // 表单验证
  validateForm() {
    const { petType, location, description, phone } = this.data.formData

    if (!petType) {
      showError('请选择宠物类型')
      return false
    }

    if (!location.trim()) {
      showError('请填写救助地点')
      return false
    }

    if (!description.trim()) {
      showError('请填写救助描述')
      return false
    }

    if (description.trim().length < 10) {
      showError('救助描述至少需要10个字符')
      return false
    }

    if (!phone.trim()) {
      showError('请填写联系电话')
      return false
    }

    if (!/^1[3-9]\d{9}$/.test(phone.trim())) {
      showError('请填写正确的手机号码')
      return false
    }

    return true
  },

  // 上传图片
  async uploadImages() {
    if (this.data.imageList.length === 0) {
      return ''
    }

    const uploadPromises = this.data.imageList.map(filePath => {
      console.log('准备上传图片:', filePath)
      return upload(filePath, 'file')
    })

    try {
      const results = await Promise.all(uploadPromises)
      console.log('所有图片上传结果:', results)

      const imageUrls = results.map((res, index) => {
        console.log(`处理第${index + 1}张图片结果:`, res)

        // 检查上传结果是否有效
        if (!res || !res.data) {
          console.error(`第${index + 1}张图片上传结果无效:`, res)
          throw new Error(`第${index + 1}张图片上传失败`)
        }

        // 检查是否是临时文件路径（这种情况说明上传失败了）
        if (res.data.includes('tmp/') || res.data.includes('wxfile://')) {
          console.error(`第${index + 1}张图片返回了临时文件路径，上传失败:`, res.data)
          throw new Error(`第${index + 1}张图片上传失败，返回了临时文件路径`)
        }

        // 将完整URL转换为相对路径存储到数据库
        if (res.data && res.data.startsWith('http')) {
          const relativePath = res.data.replace(getApp().globalData.baseUrl, '')
          console.log(`第${index + 1}张图片URL转换: ${res.data} -> ${relativePath}`)
          return relativePath
        }

        console.log(`第${index + 1}张图片使用原始路径:`, res.data)
        return res.data
      }).join(',')

      console.log('最终图片路径字符串:', imageUrls)
      return imageUrls
    } catch (err) {
      console.error('图片上传过程出错:', err)
      throw new Error('图片上传失败: ' + err.message)
    }
  },

  // 提交申请
  async onSubmit() {
    if (this.data.submitting) return

    if (!this.validateForm()) return

    try {
      await showConfirm('确认提交救助申请吗？')
    } catch {
      return
    }

    this.setData({ submitting: true })

    try {
      // 上传图片
      const images = await this.uploadImages()

      const app = getApp()
      const userInfo = app.globalData.userInfo

      const submitData = {
        petType: this.data.formData.petType,
        location: this.data.formData.location.trim(),
        description: this.data.formData.description.trim(),
        phone: this.data.formData.phone.trim(),
        images,
        userId: userInfo.id,
        userName: userInfo.name,
        status: '待处理'
      }

      await post('/rescue', submitData)
      
      showSuccess('救助申请提交成功')
      
      // 延迟返回上一页
      setTimeout(() => {
        wx.navigateBack()
      }, 1500)

    } catch (err) {
      showError(err.message || '提交失败，请重试')
    } finally {
      this.setData({ submitting: false })
    }
  }
})
